#ifndef ASDUPARSE_H
#define ASDUPARSE_H

#include <QObject>

class QString;

const int c_typenode=12;//->类型标识
const int c_canChange=14;//->可变结构限定词
const int c_transferReason=16;//->传送原因
const int c_commenAddress=20;//->公共地址

enum ASDU101_TYPE
{
    UNKOWN_ASDU101_TYPE=0,
    // 子站-〉主站过程信息
    M_SP_NA_1,		// 单点信息
    M_SP_TA_1,
    M_DP_NA_1,		// 双点信息
    M_DP_TA_1,
    M_ST_NA_1,		// 步位置信息(变压器分接头信息)
    M_ST_TA_1,
    M_BO_NA_1,		// 子站远动终端状态
    M_BO_TA_1,		// 有时标的块数据
    M_ME_NA_1,		// 带品质描述不带时标的遥测数据
    M_ME_TA_1,		// 带品质描述带时标的遥测数据
    M_ME_NB_1,		// 测量值, 标度化值, Normalize Value, Without Time Stamp
    M_ME_TB_1,		// 测量值, 带时标的标度化值, Normalize Value, With Time Stamp
    M_ME_NC_1,		// 测量值, 短浮点数, Scaled Value, short floating Without Time Stamp
    M_ME_TC_1,		// 测量值, 带时标的短浮点数, Scaled Value, short floating With Time Stamp
    M_IT_NA_1=15,	// 电能脉冲计数
    M_IT_TA_1,
    M_EP_TA_1,		// 带时标的继电保护或重合闸设备单个事件
    M_EP_TB_1,		// 带时标的继电保护装置成组启动事件
    M_EP_TC_1,		// 带时标的继电保护装置成组输出电路信息事件
    M_PS_TA_1, 		// 具有状态变位检出的成组单点信息
    M_ME_ND_1,		// 不带品质描述测量值
    VERDOR_EXTEND_22,
    VERDOR_EXTEND_23,
    VERDOR_EXTEND_24,
    VERDOR_EXTEND_25,
    VERDOR_EXTEND_26,
    VERDOR_EXTEND_27,
    VERDOR_EXTEND_28,
    VERDOR_EXTEND_29,
    M_SP_TB_1=30,   // 带CP56Time2a时标的单点信息
    M_DP_TB_1,		// 带CP56Time2a时标的双点信息
    M_ST_TB_1,		// 带CP56Time2a时标的步位置信息
    M_BO_TB_1,		// 带CP56Time2a时标的32比特串
    M_ME_TD_1,		// 带CP56Time2a时标的测量值, 规一化值
    M_ME_TE_1,		// 带CP56Time2a时标的测量值, 标度化值
    M_ME_TF_1,		// 带CP56Time2a时标的测量值, 短浮点数
    M_IT_TB_1,		// 带CP56Time2a时标的累计量
    M_EP_TD_1,		// 带CP56Time2a时标的继电保护装置事件
    M_EP_TE_1,		// 带CP56Time2a时标的继电保护装置成组启动事件
    M_EP_TF_1,		// 带CP56Time2a时标的继电保护装置成组输出电路信息
    M_BD_NA_1=232,	// BDC码(水位值)
    // 主站->子站 在控制方向的过程信息
    C_DC_NA_1=46,	// 双点遥控命令
    C_RC_NA_1,		// 升降命令
    C_SE_NA_1,		// 设定命令
    C_BO_NA_1=51,   //  32位的位串
    // 子站->主站  在监视方向的系统信息
    M_EI_NA_1=70,	// 初始化结束
    // 主站到子站，在控制方向的系统信息
    C_IC_NA_1=100,		// 召唤命令
    C_CI_NA_1,		// 电能脉冲召唤命令
    C_RD_NA_1,		// 读数据命令
    C_CS_NA_1,		// 时钟同步命令
    C_TS_NA_1,		// 测试命令
    C_RP_NA_1,		// 复位进程命令
    C_CD_NA_1,		// 延时获得命令
    // 在控制方向上的参数
    P_ME_NA_1=110,		// 装载参数命令
    P_AC_NA_1,		// 激活参数
    // 文件参数
    F_FR_NA_1=120,		// 文件已准备好
    F_SR_NA_1,			// 节已准备好
    F_SC_NA_1,			// 召唤目录、选择文件、召唤文件、召唤节
    F_LS_NA_1,			// 最后的节、最后的段
    F_AF_NA_1,			// 确认文件、确认节
    F_SG_NA_1,			// 段
    F_DR_NA_1			// 目录
};

// 定义 传送原因
enum ASDU101_TR_REASON_TYPE
{
    UNKOWN_ASDU101_REASON_TYPE=0,
    ASDU101_TR_PER,	// 周期.循环
    ASDU101_TR_BACK,	// 背景扫描
    ASDU101_TR_SPONT,  // 突发
    ASDU101_TR_INIT,   // 初始化
    ASDU101_TR_REQ,	// 请求或被请求
    ASDU101_TR_ACT,	// 激活
    ASDU101_TR_ACTCON,	// 激活确认
    ASDU101_TR_DEACT,	// 停止激活
    ASDU101_TR_DEACTCON,	// 停止激活确认
    ASDU101_TR_ACTTERM,	// 激活结束
    ASDU101_TR_RETREM,		// 远程命令引起的返送信息
    ASDU101_TR_RETLOC,		// 当地命令引起的返送信息
    ASDU101_TR_FILE,		// 文件
    ASDU101_TR_INTROGEN=20,	// 响应总召唤
    ASDU101_TR_INTRO1,			// 响应第1组召唤
    ASDU101_TR_INTRO2,			// 响应第2组召唤
    ASDU101_TR_INTRO3,			// 响应第3组召唤
    ASDU101_TR_INTRO4,			// 响应第4组召唤
    ASDU101_TR_INTRO5,			// 响应第5组召唤
    ASDU101_TR_INTRO6,			// 响应第6组召唤
    ASDU101_TR_INTRO7,			// 响应第7组召唤
    ASDU101_TR_INTRO8,			// 响应第8组召唤
    ASDU101_TR_INTRO9,			// 响应第9组召唤
    ASDU101_TR_INTRO10,			// 响应第10组召唤
    ASDU101_TR_INTRO11,			// 响应第11组召唤
    ASDU101_TR_INTRO12,			// 响应第12组召唤
    ASDU101_TR_INTRO13,			// 响应第13组召唤
    ASDU101_TR_INTRO14,			// 响应第14组召唤
    ASDU101_TR_INTRO15,			// 响应第15组召唤
    ASDU101_TR_INTRO16,			// 响应第16组召唤
    ASDU101_TR_REQCOGCN,			// 响应计数量总召唤
    ASDU101_TR_REQCO1,				// 响应第1组计数量召唤
    ASDU101_TR_REQCO2,				// 响应第2组计数量召唤
    ASDU101_TR_REQCO3,				// 响应第3组计数量召唤
    ASDU101_TR_REQCO4				// 响应第4组计数量召唤
};

class ASDUparse : public QObject
{
    Q_OBJECT
public:
    explicit ASDUparse(QObject *parent = 0);
    QString strAsduTypeName(const QString &data_parse);//->取ASDU101类型名称
    QString strGetCanChange(const QString data_parse);//->可变结构限定词
    QString strGetReasonName(const QString &data_parse);//->取ASDU101原因名称
    QString strGetAddress(const QString data_parse); //->获取公共地址

    int getType();
    int getSq();
    int getVsq();

private:
    bool ok;

    //右栏：信息位解析：
    int _p_sq;//记录离散或者顺序的
    int _p_type;//记录信息类型
    int _p_vsq;//记录信息体个数

signals:

public slots:

};

#endif // ASDUPARSE_H
